package com.project.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class ManAspect {

    //申明目标对象的范围，第一个*号表示返回类型为任意返回类型
    //om.project.service. *.*  表示om.project.service包中所有的类中，所有的方法
    //(..)表示方法参数为任意类型
    //..*.*是包含此包的子包
    @Before("execution(* com.project.service..*.*(..))")
    public void before(){
        System.out.println("前置通知");
    }
    @After("execution(* com.project.service..*.*(..))")
    public void after(){
        System.out.println("后通知");
    }

    @Around("execution(* com.project.service..*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕前");
        //执行目标方法,得到目标方法执行后的返回值
      Object retrunObject =  joinPoint.proceed();
        //得到目标对象
      Object obj = joinPoint.getTarget();
        System.out.println("环绕后");
        return retrunObject;
    }
    //抛出异常通知，value 表示目标对象和目标方法的范围
    //throwing表示用指定变量接受目标方法抛出异常
    @AfterThrowing(value = "execution(* com.project.service..*.*(..))",
            throwing = "e")
    public void pressException(JoinPoint joinPoint,Exception e){
        //得到目标对象的类的全路径
     String targetName =  joinPoint.getTarget().getClass().getName();
     //得到目标方法名
    String methodName = joinPoint.getSignature().getName();

    System.out.println("执行 "+ targetName+"的 "+ methodName+" ,抛出"+
            e.getClass().getName());
    }

}
